package cn.edu.zjicm.wordsnet_d.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.View;
import cn.edu.zjicm.wordsnet_d.R;
import cn.edu.zjicm.wordsnet_d.util.Utils;

public class RoundProgress extends View {

	private Paint paint;

	// 环形默认背景颜色
	private int roundColor;
	// 环形进度背景颜色
	private int roundProgressColor;
	// 进度显示字体颜色
	private int textColor;
	// 填充颜色
	private int solidColor;
	// 进度显示字体大小
	private float textSize;
	// 环形进度宽度
	private float roundWidth;
	// 进度样式，默认为环形样式
	private int style;
	// 进度最大值，默认100
	private int max;

	// 进度值
	private int progress = 40;

	// 环形样式
	private static final int STROKE = 0;
	// 饼状样式
	private static final int FILL = 1;

	private RectF oval, ovalInner;

	public RoundProgress(Context context) {
		this(context, null);
	}

	public RoundProgress(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public RoundProgress(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

		paint = new Paint();

		TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundProgress);
		roundColor = mTypedArray.getColor(R.styleable.RoundProgress_roundColor, Color.argb(22, 0, 0, 0));
		roundProgressColor = mTypedArray.getColor(R.styleable.RoundProgress_progressColor, Color.YELLOW);
		textColor = mTypedArray.getColor(R.styleable.RoundProgress_textColor, Color.BLACK);
		solidColor = mTypedArray.getColor(R.styleable.RoundProgress_solidColor, context.getResources().getColor(R.color.main_solid_color));
		textSize = mTypedArray.getDimension(R.styleable.RoundProgress_textSize, 15);
		roundWidth = mTypedArray.getDimension(R.styleable.RoundProgress_Width, Utils.changeDipToPx(getContext(), 8));
		max = mTypedArray.getInteger(R.styleable.RoundProgress_roundMax, 100);
		style = mTypedArray.getInt(R.styleable.RoundProgress_style, 0);
		mTypedArray.recycle();
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int mode = MeasureSpec.getMode(widthMeasureSpec);
		int width = Utils.getScreenWidth(getContext());
		widthMeasureSpec = MeasureSpec.makeMeasureSpec((int) (width * 3.0f / 5.0f), mode);
		super.onMeasure(widthMeasureSpec, widthMeasureSpec);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		int centre = getWidth() / 2;
		// 绘制内圆
		int radius = (int) (centre - roundWidth / 2);

		if (oval == null) {
			oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius);
		}
		if (ovalInner == null) {
			ovalInner = new RectF(centre - radius + roundWidth, centre - radius + roundWidth, centre + radius - roundWidth, centre + radius - roundWidth);
		}

		paint.setStrokeWidth(roundWidth);
		paint.setAntiAlias(true);

		paint.setColor(solidColor);
		paint.setStyle(Paint.Style.FILL_AND_STROKE);
		canvas.drawArc(ovalInner, 0, 360, true, paint);

		paint.setStyle(Paint.Style.STROKE);
		paint.setColor(roundColor);
		canvas.drawCircle(centre, centre, radius, paint);

		// 绘制进度值文字
		paint.setStrokeWidth(0);
		paint.setColor(textColor);
		paint.setTextSize(textSize);
		paint.setTypeface(Typeface.DEFAULT_BOLD);

		// 绘制环形（扇形）进度
		paint.setStrokeWidth(roundWidth);
		paint.setColor(roundProgressColor);

		switch (style) {
		case STROKE:
			paint.setStyle(Paint.Style.STROKE);
			float angleEnd = (float) (360.0 * progress / max);
			canvas.drawArc(oval, -90, angleEnd, false, paint);
			paint.setStrokeWidth(0);
			paint.setStyle(Paint.Style.FILL);
			angleEnd = (float) ((angleEnd - 90) * Math.PI / 180.0);
			float angleStart = (float) ((-90) * Math.PI / 180.0);
			canvas.drawCircle((float) (radius * Math.cos(angleEnd) + centre), (float) (radius * Math.sin(angleEnd) + centre), roundWidth / 2.0f, paint);
			canvas.drawCircle((float) (radius * Math.cos(angleStart) + centre), (float) (radius * Math.sin(angleStart) + centre), roundWidth / 2.0f, paint);
			break;

		case FILL:
			paint.setStyle(Paint.Style.FILL_AND_STROKE);
			if (progress != 0)
				canvas.drawArc(oval, -90, (360 - 90) * progress / max, true, paint);
			break;
		}

	}

	public int getMax() {
		return max;
	}

	public void setMax(int max) {
		if (max < 0) {
			throw new IllegalArgumentException("max not less than 0");
		}
		this.max = max;
	}

	public int getProgress() {
		return progress;
	}

	public void setProgress(int progress) {
		if (progress < 0) {
			throw new IllegalArgumentException("progress not less than 0");
		}
		if (progress > max) {
			progress = max;
		}
		if (progress <= max) {
			this.progress = progress;
			postInvalidate();
		}
	}

	public int getCricleColor() {
		return roundColor;
	}

	public void setCricleColor(int cricleColor) {
		this.roundColor = cricleColor;
	}

	public int getCricleProgressColor() {
		return roundProgressColor;
	}

	public void setCricleProgressColor(int cricleProgressColor) {
		this.roundProgressColor = cricleProgressColor;
	}

	public int getTextColor() {
		return textColor;
	}

	public void setTextColor(int textColor) {
		this.textColor = textColor;
	}

	public float getTextSize() {
		return textSize;
	}

	public void setTextSize(float textSize) {
		this.textSize = textSize;
	}

	public float getRoundWidth() {
		return roundWidth;
	}

	public void setRoundWidth(float roundWidth) {
		this.roundWidth = roundWidth;
	}

}
